<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>es5 创建对象过程内存</title>
  <!-- 
  在 JavaScript ES5 中，创建对象的过程涉及几个重要的步骤和内存管理的概念。
  1. 对象的创建方式
  在 ES5 中，创建对象主要有以下几种方式：
  - 字面量方式：
    var obj = { name: "Alice", age: 25 };
  - 构造函数方式：
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    var person1 = new Person("Alice", 25);
  - Object.create() 方法：
    var proto = { greet: function() { console.log("Hello!"); } };
    var obj = Object.create(proto);
  2. 内存分配
  当你创建一个对象时，JavaScript 引擎会在内存中执行以下操作：

  - 分配内存：为新对象分配一块内存空间。
  - 初始化属性：根据对象的定义（如字面量、构造函数等），初始化对象的属性。
  - 设置原型：如果是通过构造函数创建对象，JavaScript 会将对象的  `[[Prototype]]`  指向构造函数的  `prototype`  属性。

  3. 对象的引用
  在 JavaScript 中，对象是通过引用来访问的。这意味着：
  - 当你将一个对象赋值给另一个变量时，两个变量指向同一块内存。
  - 修改其中一个变量的属性会影响另一个变量，因为它们引用的是同一个对象。
  var obj1 = { name: "Alice" };
  var obj2 = obj1; // obj2 引用 obj1
  obj2.name = "Bob"; 
  console.log(obj1.name); // 输出: Bob

  4. 垃圾回收
  JavaScript 使用垃圾回收机制来管理内存。它会自动清理不再使用的对象，以释放内存。以下是一些基本概念：
  - 可达性：如果一个对象仍然可以通过其他对象访问到，那么它是可达的，垃圾回收机制不会清除它。
  - 不可达性：如果一个对象没有任何引用指向它，那么它就被认为是不可达的，最终会被垃圾回收机制清除。

  5. 注意事项
  - 在创建对象时，尽量避免创建不必要的全局对象，以减少内存占用。
  - 使用构造函数和原型可以有效地共享方法和属性，减少内存的使用。
  - 了解对象的引用和内存管理可以帮助你更好地优化代码，避免内存泄漏。

  总结
  在 JavaScript ES5 中，创建对象的过程涉及内存的分配、属性的初始化和原型的设置。理解对象的引用和垃圾回收机制对于有效管理内存和优化性能至关重要。通过合理的对象创建方式和内存管理，可以提高代码的效率和可维护性。
   -->
</head>
<body>

  <script>
    function Person(name, age) {
      this.name = name;
      this.age = age;
    }

    // 新增方法
    Person.prototype.greet = function() {
      console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
    };

    // 新增属性
    Person.prototype.species = "human";

    // 创建对象
    var alice = new Person("Alice", 25);
    var join = new Person("join", 25);
    alice.greet(); // 输出: Hello, my name is Alice and I am 25 years old.
    alice.__proto__.species; // 输出: human
    alice.__proto__.info = "info"; // 新增属性
    alice.height = 170; // 新增属性

    console.log(alice); // 输出: 170
    console.log(alice.__proto__.info); // 输出: info
    console.log(alice.__proto__.species); // 输出: human

    join.greet(); // 输出: Hello, my name is join and I am 25 years old.
    join.__proto__.species; // 输出: human
    join.__proto__.info = "info"; // 新增属性
    join.height = 170; // 新增属性

    console.log(join); // 输出: 170
    console.log(join.__proto__.info); // 输出: info
    console.log(join.__proto__.species); // 输出: human

    
  </script>
  
</body>
</html>